#include "mg_MainTask.h"

static pthread_t mg_maintask;//任务ID
static volatile bool mgTaskQuit = false;
static void* mg_MainTask(void* arg);

static pthread_t RS485_task, RS485_TimeOver;//任务ID
static volatile bool RS485TaskQuit = false;
static void* mg_RS485Task(void* arg);
static void* mg_RS485TimeOver(void* arg);

volatile SYSTEM_EEPROM_VALUE	Sys;//模块系统参数
volatile DEVICE_STATE_VALUE		Dev;//模块运行参数
volatile Type_TFT_Device TFT_Device[DeviceNumMax+1];//配置的设备属性
volatile Type_TFT_Device_State TFT_Device_State[DeviceNumMax + 1];//配置的设备状态
volatile Type_TFT_Device_State TFT_Device_Cmd[DeviceNumMax + 1];//配置的设备执行命令
volatile TFT_Display_Config DisplayValue;//当前显示的设备序号
volatile ENUM_MSG_STATE		MessageFlag[MSG_NUM];//消息列表


//总初始化
void Mg_Init(void)
{
	printf("Moorgen INFO:Software version : %s\r\n", SOFTWARE_VERSION);
	printf("Moorgen INFO:Moorgen code Init......\n");
#ifndef _WIN32
	
	ioctl(ITP_DEVICE_BACKLIGHT, ITP_IOCTL_OFF, NULL);
	RealTimeInit();		//实时时间设定
	//BOARD_InitLed();	//LED初始化
	timer_init();		//定时初始化
	Mg_I2C_Init();		//初始化I2C
	PAJ7620_Init();		//初始化手势传感器
	RT_Sensor_Init();	//初始化旋转传感器
	LED_Init();			//RGB驱动初始化
	EEprom_Init();		//初始化E2并读取数据或写入出厂数据
	CheckDatasValid();	//数据合理性检测
	Bee_Init();			//蜂鸣器初始化
	RS485Init();		//485初始化
	file_init();		//临时文件初始化
	MessageFlagSet();	//初始化标记队列
	pthread_create(&mg_maintask, NULL, mg_MainTask, NULL);
#else
	MessageFlagSet();	//初始化标记队列
	Set_Debug_Sys_Config();
	Set_Debug_Dev_Config();//----------------------------------------此句测试用，发布时记得删
#endif
	printf("Moorgen INFO:Moorgen code Init completed\n");
}

//传感器检测任务
static void* mg_MainTask(void* arg)
{

	while (!mgTaskQuit)
	{
		RT_Sensor_Check();//旋转传感器检测
		Gesture_Check();//手势传感器检测
		LedRingProgress(); //LED灯圈处理
		EepromSaveProgress();//EEP数据存储
		if (MessageFlag[MSG_RS485_EN] == ON)
		{
			MessageFlag[MSG_RS485_EN] = OFF;
			Clean_Rs485_Data();
			RS485PointSendReg(); 	//注册入网请求帧
			pthread_create(&RS485_TimeOver, NULL, mg_RS485TimeOver, NULL);
			pthread_create(&RS485_task, NULL, mg_RS485Task, NULL);
		}
		usleep(10 * 1000);//10Ms
	}
	return NULL;
}
//485数据超时判断
static void* mg_RS485TimeOver(void* arg)
{
	while (!RS485TaskQuit)
	{
		RS485SendProcess_Timer();//退避定时
		RS485RxOverTimIsr();//检测数据接收是否超时（分包）
		usleep(1000);//1ms
	}
	return NULL;
}
//485数据处理与发送
static void* mg_RS485Task(void* arg)
{
	while (!RS485TaskQuit)
	{
		RS485DeviceStateRenew();//本身状态更新
		RS485GetDeviceState();	//请求设备状态
		RS485RxDataHandle();	//数据接收解析
		RS485ReSendProcess();	//数据重发进程
		DecSendCmdTimeCheck();	//与网关对时
		Mobus_SendProcess();	//发送进程
		usleep(10 * 1000);//10ms
	}
	return NULL;
}
//初始化标记
void MessageFlagSet(void)
{
	uint8_t i;
	for (i = 0; i < MSG_NUM; i++)
		MessageFlag[i] = OFF;
	MessageFlag[MSG_GET_ALL_DEVICE_STATE] = ON;//查询所有设备的状态
	MessageFlag[MSG_GET_DEVICE_STATE_EN] = ON;//允许10s获取一次设备状态
	MessageFlag[MSG_GET_DEVICE_CONFIG_EN] = OFF;//允许10s获取一次设备状态
	MessageFlag[MSG_GET_TIME] = ON;	//向网关请求时间
}